CC =  g++
# -g：生成调试信息
# -O0：禁用优化（推荐配合调试使用）
# 编译器优化（如 -O1/-O2）可能重组代码，导致调试时断点错位或变量不可见
CFLAGS = -Wall -Wextra -g -O0 -I/home/luo/mylibs/include
#
# 为什么 -lGL 省略了前缀和后缀？
#	-l 的命名规则：
#	当使用 -l<name> 时，链接器会自动查找名为 lib<name>.so（动态库） 或 lib<name>.a（静态库） 的文件。
#	例如：
#
#	-lGL → 链接器查找 libGL.so 或 libGL.a
#
#	-lglfw3 → 链接器查找 libglfw3.so 或 libglfw3.a
#
#	历史原因：
#	这是 Unix 工具链的长期约定，目的是简化命令行输入。
#
#
LDFLAGS = -L/home/luo/mylibs/lib \
			-lglfw3 \
			-lGL \
			-lX11 \
			-lpthread \
			-lXrandr \
			-lXi \
			-ldl

TARGET = helloOpenGL
SRC = hello_openGL.cpp
SRC += glad.c
SRC += SimpleTriangle.cpp
SRC += EboRectangleRenderer.cpp
SRC += UniformShader.cpp
SRC += ShaderProgram.cpp
SRC += InOutShader.cpp
SRC += VerticesColorTriangle.cpp
SRC += MatrixTransformationShader.cpp
SRC += CoordinateSystemShader.cpp
SRC += WoodenTextureShader.cpp
SRC += Renderer.cpp
SRC += TextureProxyShader.cpp
SRC += More3D.cpp
SRC += RotationByTimeShader.cpp
SRC += AutoRotateCameraShader.cpp
SRC += MovingLocationShader.cpp
SRC += MovingCameraByKeybord.cpp


# OBJS = $(SRCS:.cpp=.o) 是一个 变量替换操作，
# 它的作用是将变量 SRCS 中所有 .cpp 后缀的文件名替换为 .o 后缀，
# 生成对应的目标文件列表，并赋值给变量 OBJS。
OBJS = $(SRC:.cpp=.o)      # 替换 .cpp → .o
OBJS := $(OBJS:.c=.o)       # 继续替换 .c → .o

all: $(TARGET)

$(TARGET): $(OBJS)
# 同样，链接时也不需要指定编译时选项 $(CFLAGS)
# $(OBJS) 展开为规则的所有依赖项（这里是所有 .o 文件）	链接阶段（需要所有目标文件）
	$(CC) $(OBJS) -o $@  $(LDFLAGS)

%.o: %.cpp
# $< 展开为规则的 第一个依赖项（例如 main.o，但不会包含其他 .o）
# $< 通常用于 从单个源文件生成单个目标文件 的规则中
# 这里 $< 是合适的，因为每次只处理一个文件。
	$(CC)  $(CFLAGS) -c $< -o $@ 

glad.o: glad.c
# 编译的时候不需要指定 $< $(LDFLAGS) 
	gcc  $(CFLAGS) -c $< -o $@ 

clean:
	rm -f $(TARGET) *.o

prepareLibs:
	wget https://github.com/g-truc/glm/releases/download/1.0.1/glm-1.0.1-light.zip
	unzip glm-1.0.1-light.zip

.PHONY: all clean